/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Informes;

import Controladores.ControladorFeriados;
import Entidades.Asistencia;
import Entidades.Empleado;
import Entidades.EmpleadoJornada;
import Entidades.FeriadoAsueto;
import Entidades.JornadaLaboral;
import Entidades.Licencia;
import Entidades.Oficina;
import Expertos.ConvertirFechas;
import Expertos.ExpertoInforme;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

/**
 *
 * @author diego
 */
public class InformeAsistenciaOficinas {

    public InformeAsistenciaOficinas() {
    }
    Controladores.ControladorFeriados cf = new ControladorFeriados();
    Expertos.ExpertoInforme ei = new ExpertoInforme();

    public void imprimir(Date fechadesde, Date fechahasta, String nombreArchivo, Oficina oficina) {
        Document documento = new Document();
        FileOutputStream ficheroPdf;
        String archivo = nombreArchivo;
        String cabecera;
        Date fechaSistema = new Date();
        String ausente = "ausente";
        String rayita = "--------";
        String feriado = "Feriado";
        String liccadena = "Licencia";
        int tardanzas;
        int totaltardanzas = 0;
        int diasasistencia = 0;
        int difEntrada = 0;
        int difSalida = 0;
        int cantidaddias;
        int cantfya = 0;
        int diaslaborables;
        int resultadoFecha = 0;
        int resultadoFeriado = 1;
        int resultadoLicencia = 1;
        Date fechaBD = null;
        cabecera = "_____________________________________________________________________________" + "\n"
                + "\n"
                + "\n"
                + "                                            INFORME DE ASISTENCIA DE OFICINAS " + "\n"
                + "\n"
                + "\n"
                + "______________________________________________________________________________" + "\n"
                + "\n Periodo: " + ConvertirFechas.fechaAString(fechadesde) + "   " + ConvertirFechas.fechaAString(fechahasta) + "\n"
                + "   Oficina: " + oficina.getNombreOficina() + "   N° " + oficina.getNumeroOficina();
        try {
            ficheroPdf = new FileOutputStream(archivo);
            PdfWriter.getInstance(
                    documento,
                    ficheroPdf).setInitialLeading(20);
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        try {
            documento.open();
            documento.add(new Paragraph(ConvertirFechas.fechaAString(fechaSistema) + "     REGISTRO DEL ESTADO CIVIL Y CAPACIDAD DE LAS PERSONAS"));
            documento.add(new Paragraph(cabecera));
            documento.add(new Paragraph("\n"));
            Paragraph parrafo2 = new Paragraph("\n");
            parrafo2.setAlignment(1);//el 1 es para centrar
            documento.add(parrafo2);
            documento.add(new Paragraph("\n"));
            PdfPTable tabla = new PdfPTable(7);
            //el numero indica la cantidad de Columnas//
            tabla.addCell("Empleado");
            tabla.addCell("Legajo");
            tabla.addCell("Fecha de Entrada");
            tabla.addCell("Hora de Entrada");
            tabla.addCell("Tardanza");
            tabla.addCell("Fecha de Salida");
            tabla.addCell("Hora de Salida");
            /////// fechadesde y fechahasta con DATE y las voy a convertir a CALENDAR
            Calendar cali = GregorianCalendar.getInstance();
            Calendar calo = GregorianCalendar.getInstance();
            Calendar cali2 = GregorianCalendar.getInstance();
            Calendar calo2 = GregorianCalendar.getInstance();
            Calendar calfya = GregorianCalendar.getInstance();
            cali.setTime(fechadesde);
            calo.setTime(fechahasta);
            cali2.setTime(fechadesde);
            calo2.setTime(fechahasta);
            List<Date> dias = ConvertirFechas.getDiasHabiles(cali2, calo2);
            cantidaddias = ConvertirFechas.getCantidadDiasHabiles(cali, calo);
            List<FeriadoAsueto> fya = cf.buscarFeriadosVigentes();
            cali.setTime(fechadesde);
            calo.setTime(fechahasta);
            for (FeriadoAsueto feriadoAsueto : fya) {
                calfya.setTime(feriadoAsueto.getFechaFA());
                while ((cali.before(calfya) || cali.equals(calfya))) {
                    if (cali.equals(calfya) && feriadoAsueto.getferiado() && calo.after(calfya)) {
                        System.out.println("Soy feriado: " + feriadoAsueto.getFechaFA());
                        cantfya++;
                    }
                    cali.add(Calendar.DATE, 1);
                }
                cali.setTime(fechadesde);
            }
            List<Empleado> e = (List<Empleado>) oficina.getEmpleadoCollection();
            for (Empleado empleado : e) {
                List<EmpleadoJornada> lej = ei.buscarEmpleadoJornadaporIDEmpleado(empleado);
                Integer idJornadaLaboral = lej.get(0).getIdJornadaLaboral().getIdJornadaLaboral();
                List<JornadaLaboral> jl2 = ei.buscarJornadaLaboralporIDJornadaLaboral(idJornadaLaboral);
                List<Licencia> licencialista = (List<Licencia>) empleado.getLicenciaLista();
                JornadaLaboral jl = jl2.get(0);
                if (empleado.getVigente() == true) {
                    List<Asistencia> as = (List<Asistencia>) empleado.getAsistenciaLista();
                    for (Date diashabiles : dias) {
                        for (Asistencia asistencia : as) {
                            resultadoFecha = diashabiles.compareTo(asistencia.getFechaEntradaAsistencia());
                            //falta lo de los feriados
                            for (FeriadoAsueto feriadoAsueto : fya) {
                                if (diashabiles.compareTo(feriadoAsueto.getFechaFA()) == 0) {
                                    resultadoFeriado = 0;
                                }
                            }
                            if (licencialista != null) {
                                for (Licencia lic : licencialista) {
                                    if (((diashabiles.compareTo(lic.getFechaInicioLicencia())) >= 0) && ((diashabiles.compareTo(lic.getFechaFinLicencia())) <= 0) && (lic.getEstadoLicenciaCollection().get(2).getNombreEstado().equals("En uso"))) {
                                        resultadoLicencia = 0;
                                        System.out.println("Estoy de licencia el dia: " + ConvertirFechas.fechaAString(diashabiles));
                                    }
                                    break;
                                }
                            }
                            if (resultadoFeriado == 0) {
                                tabla.addCell(empleado.getApellido());
                                tabla.addCell(String.valueOf(empleado.getLegajoEmpleado()));
                                //Represento la entrada en el PDF
                                tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                if (resultadoLicencia == 0) {
                                    tabla.addCell(liccadena);
                                    tabla.addCell(rayita);
                                } else {
                                    tabla.addCell(feriado);
                                    tabla.addCell(rayita);
                                }
                                // Fin de la entrada
                                //Represento la salida en el PDF
                                tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                if (resultadoLicencia == 0) {
                                    tabla.addCell(liccadena);
                                    resultadoLicencia = 1;
                                } else {
                                    tabla.addCell(feriado);
                                }
                                resultadoFeriado = 1;
                                // Fin de la salida
                                break;
                            }
                            if (resultadoFecha == 0) {
                                fechaBD = asistencia.getFechaEntradaAsistencia();
                                ///Diferencia en la entrada
                                Date hsEntradaJL = empleado.getEjLista().get(0).getIdJornadaLaboral().getHsEntradaJL();
                                Date hsSalidaJL = empleado.getEjLista().get(0).getIdJornadaLaboral().getHsSalidaJL();
                                if (asistencia.getHsSalida() == null) {
                                    difSalida = 0;
                                } else {
                                    difSalida = ConvertirFechas.restarHorasTardanzas(asistencia.getHsSalida(), hsSalidaJL);
                                }
                                difEntrada = ConvertirFechas.restarHorasTardanzas(asistencia.getHsEntrada(), hsEntradaJL);
                                System.out.println("Diferencia entrada: " + difEntrada + "   Diferencia salida: " + difSalida);
                                if (difSalida < 0) {
                                    tabla.addCell(empleado.getApellido());
                                    tabla.addCell(String.valueOf(empleado.getLegajoEmpleado()));
                                    //Represento la entrada en el PDF
                                    tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                    if (resultadoLicencia == 0) {
                                        tabla.addCell(liccadena);
                                        tabla.addCell(rayita);
                                    } else {
                                        tabla.addCell(ausente);
                                        tabla.addCell(rayita);
                                    }
                                    // Fin de la entrada
                                    //Represento la salida en el PDF
                                    tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                    if (resultadoLicencia == 0) {
                                        tabla.addCell(liccadena);
                                        resultadoLicencia = 1;
                                    } else {
                                        tabla.addCell(ausente);
                                    }
                                    // Fin de la salida
                                    resultadoFeriado = 1;
                                    break;
                                }
                                if (asistencia.getFechaSalidaAsistencia() != null && (difEntrada <= empleado.getEjLista().get(0).getIdJornadaLaboral().getTolerancia()) && (difSalida >= 0)) {
                                    tabla.addCell(empleado.getApellido());
                                    tabla.addCell(String.valueOf(empleado.getLegajoEmpleado()));
                                    //Represento la entrada en el PDF
                                    tabla.addCell(ConvertirFechas.fechaFormateada(asistencia.getFechaEntradaAsistencia()));
                                    tabla.addCell(ConvertirFechas.horaAString(asistencia.getHsEntrada()));
                                    ///Calculo la tardanza de entrada
                                    tardanzas = ConvertirFechas.restarHorasTardanzas(asistencia.getHsEntrada(), jl.getHsEntradaJL());
                                    if (tardanzas <= 0) {
                                        tardanzas = 0;
                                    }
                                    tabla.addCell(String.valueOf(tardanzas));
                                    totaltardanzas += tardanzas;
                                    // Fin de la entrada
                                    //Represento la salida en el PDF
                                    tabla.addCell(ConvertirFechas.fechaFormateada(asistencia.getFechaSalidaAsistencia()));
                                    tabla.addCell(ConvertirFechas.horaAString(asistencia.getHsSalida()));
                                    // Fin de la salida
                                    resultadoFeriado = 1;
                                    diasasistencia++;
                                }
                                break;
                            }
                            ///Cargo filas ausentes
                            if (resultadoFecha < 0) {
                                tabla.addCell(empleado.getApellido());
                                tabla.addCell(String.valueOf(empleado.getLegajoEmpleado()));
                                //Represento la entrada en el PDF
                                tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                if (resultadoLicencia == 0) {
                                    tabla.addCell(liccadena);
                                    tabla.addCell(rayita);
                                } else {
                                    tabla.addCell(ausente);
                                    tabla.addCell(rayita);
                                }
                                // Fin de la entrada
                                //Represento la salida en el PDF
                                tabla.addCell(ConvertirFechas.fechaFormateada(diashabiles));
                                if (resultadoLicencia == 0) {
                                    tabla.addCell(liccadena);
                                    resultadoLicencia = 1;
                                } else {
                                    tabla.addCell(ausente);
                                }
                                // Fin de la salida
                                resultadoFeriado = 1;
                                break;
                            }

                            resultadoFeriado = 1;
                        }
                    }
                    if (empleado.getVigente() == true) {
                        diaslaborables = cantidaddias - cantfya;
                        documento.add(tabla);
                        documento.add(new Paragraph("Total de dias laborables: " + diaslaborables));
                        documento.add(new Paragraph("Total de dias trabajados: " + diasasistencia));
                        documento.add(new Paragraph("Presentismo: " + ((diasasistencia * 100) / diaslaborables) + "%"));
                        documento.add(new Paragraph("Total de faltas: " + (diaslaborables - diasasistencia)));
                        documento.add(new Paragraph("Total de atrasos: " + totaltardanzas + " minutos"));
                        documento.add(new Paragraph("\n"));
                        tabla.deleteBodyRows();
                        diasasistencia = 0;
                    }
                }
            }
            documento.add(new Paragraph("______________________________________________________________________________"));
            //documento.add(new Paragraph("Total de empleados: " + e.size()));
            documento.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }
}
